package com.ks.utils;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.net.UnknownHostException;
import java.nio.charset.Charset;
import java.util.HashSet;
import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import javax.servlet.http.HttpServletRequest;


/**
 * 获取系统的信息
 * @author changxiong.zhu
 *
 */
@SuppressWarnings("unused")
public final class SystemKit {
	/**
	 * 获取访问者IP
	 * 在一般情况下使用Request.getRemoteAddr()即可，但是经过nginx等反向代理软件后，这个方法会失效。
	 *
	 * 本方法先从Header中获取X-Real-IP，如果不存在再从X-Forwarded-For获得第一个IP(用,分割)，
	 * 如果还不存在则调用Request .getRemoteAddr()。
	 * @param request
	 * @return
	 */
	public static String getIpAddr(HttpServletRequest request) {
		String ip = request.getHeader("X-Real-IP");
		if (ip!= null && !"".equals(ip) && !"unknown".equalsIgnoreCase(ip)) {
			return ip;
		}
		ip = request.getHeader("X-Forwarded-For");
		if (ip!= null && !"".equals(ip)  && !"unknown".equalsIgnoreCase(ip)) {
			// 多次反向代理后会有多个IP值，第一个为真实IP。
			int index = ip.indexOf(',');
			if (index != -1) {
				return ip.substring(0, index);
			} else {
				return ip;
			}
		} else {
			return request.getRemoteAddr();
		}
	}

	/**
	 * 获取来访者的浏览器版本
	 * @param request
	 * @return
	 */
	public static String getRequestBrowserInfo(HttpServletRequest request){
		String browserVersion = null;
		String header = request.getHeader("user-agent");
		if(header == null || header.equals("")){
			return "";
		}
		if(header.indexOf("MSIE")>0){
			browserVersion = "IE";
		}else if(header.indexOf("Firefox")>0){
			browserVersion = "Firefox";
		}else if(header.indexOf("Chrome")>0){
			browserVersion = "Chrome";
		}else if(header.indexOf("Safari")>0){
			browserVersion = "Safari";
		}else if(header.indexOf("Camino")>0){
			browserVersion = "Camino";
		}else if(header.indexOf("Konqueror")>0){
			browserVersion = "Konqueror";
		}
		return browserVersion;
	}

	/**
	 * 获取系统版本信息
	 * @param request
	 * @return
	 */
	public static String getRequestSystemInfo(HttpServletRequest request){
		String systenInfo = null;
		String header = request.getHeader("user-agent");
		if(header == null || header.equals("")){
			return "";
		}
		//得到用户的操作系统
		if (header.indexOf("NT 6.0") > 0){
			systenInfo = "Windows Vista/Server 2008";
		} else if (header.indexOf("NT 5.2") > 0){
			systenInfo = "Windows Server 2003";
		} else if (header.indexOf("NT 5.1") > 0){
			systenInfo = "Windows XP";
		} else if (header.indexOf("NT 6.0") > 0){
			systenInfo = "Windows Vista";
		} else if (header.indexOf("NT 6.1") > 0){
			systenInfo = "Windows 7";
		} else if (header.indexOf("NT 6.2") > 0){
			systenInfo = "Windows Slate";
		} else if (header.indexOf("NT 6.3") > 0){
			systenInfo = "Windows 9";
		} else if (header.indexOf("NT 5") > 0){
			systenInfo = "Windows 2000";
		} else if (header.indexOf("NT 4") > 0){
			systenInfo = "Windows NT4";
		} else if (header.indexOf("Me") > 0){
			systenInfo = "Windows Me";
		} else if (header.indexOf("98") > 0){
			systenInfo = "Windows 98";
		} else if (header.indexOf("95") > 0){
			systenInfo = "Windows 95";
		} else if (header.indexOf("Mac") > 0){
			systenInfo = "Mac";
		} else if (header.indexOf("Unix") > 0){
			systenInfo = "UNIX";
		} else if (header.indexOf("Linux") > 0){
			systenInfo = "Linux";
		} else if (header.indexOf("SunOS") > 0){
			systenInfo = "SunOS";
		}
		return systenInfo;
	}

	/**
	 * 获取来访者的主机名称
	 * @param ip
	 * @return
	 */
	public static String getHostName(String ip){
		InetAddress inet;
		try {
			inet = InetAddress.getByName(ip);
			return inet.getHostName();
		} catch (UnknownHostException e) {
			e.printStackTrace();
		}
		return "";
	}
	


	/**
	 * 命令获取mac地址
	 * @param cmd
	 * @return
	 */
	private static String callCmd(String[] cmd) {
		String result = "";
		String line = "";
		try {
			Process proc = Runtime.getRuntime().exec(cmd);
			InputStreamReader is = new InputStreamReader(proc.getInputStream());
			BufferedReader br = new BufferedReader (is);
			while ((line = br.readLine ()) != null) {
				result += line;
			}
		}catch(Exception e) {
			e.printStackTrace();
		}
		return result;
	}
	/**
	 *
	 *
	 *
	 * @param cmd
	 *            第一个命令
	 *
	 * @param another
	 *            第二个命令
	 *
	 * @return 第二个命令的执行结果
	 *
	 */

	private static String callCmd(String[] cmd,String[] another) {
		String result = "";
		String line = "";
		try {
			Runtime rt = Runtime.getRuntime();
			Process proc = rt.exec(cmd);
			proc.waitFor(); // 已经执行完第一个命令，准备执行第二个命令
			proc = rt.exec(another);
			InputStreamReader is = new InputStreamReader(proc.getInputStream(), Charset.forName("GBK"));
			BufferedReader br = new BufferedReader (is);
			while ((line = br.readLine ()) != null) {
				result += line + "\r\n";
			}
		}catch(Exception e) {
			e.printStackTrace();
		}
		return result;
	}
	
	public static void main(String[] args) {
		System.out.println("123");
		String[] cmd = {"cmd","/c","ping " + "10.253.42.175"};
		String[] another = {"cmd","/c","arp -a"};
		SystemKit.callCmd(cmd, another);
	}

	/**
	 *
	 *
	 *
	 * @param ip
	 *            目标ip,一般在局域网内
	 *
	 * @param sourceString
	 *            命令处理的结果字符串
	 *
	 * @param macSeparator
	 *            mac分隔符号
	 *
	 * @return mac地址，用上面的分隔符号表示
	 *
	 */

	private static String filterMacAddress(final String ip, final String sourceString,final String macSeparator) {
		String result = "";
		String regExp = "((([0-9,A-F,a-f]{1,2}" + macSeparator + "){1,5})[0-9,A-F,a-f]{1,2})";
		Pattern pattern = Pattern.compile(regExp);
		Matcher matcher = pattern.matcher(sourceString);
		int index = sourceString.indexOf(ip);
		if(index>0){
			while(matcher.find()){
				result = matcher.group(1);
				if(index <= sourceString.indexOf(result)) {
					break; // 如果有多个IP,只匹配本IP对应的Mac.
				}else{
					result = "";
				}
			}
		}

		return result;
	}

	/**
	 * @param ip
	 *            目标ip
	 * @return Mac Address
	 *
	 */

	
	private static String getMacInWindows(final String ip){
		String result = "";
		String[] cmd = {"cmd","/c","ping " + ip};
		String[] another = {"cmd","/c","arp -a"};
		String cmdResult = callCmd(cmd,another);
		result = filterMacAddress(ip,cmdResult,"-");
		return result;
	}
	/**
	 *
	 * @param ip
	 *            目标ip
	 * @return Mac Address
	 *
	 */
	private static String getMacInLinux(final String ip){
		String result = "";
		String[] cmd = {"/bin/sh","-c","ping " +  ip + " -c 2 && arp -a" };
		String cmdResult = callCmd(cmd);
		result = filterMacAddress(ip,cmdResult,":");
		return result;
	}


	
	private static String getLocalMac() {
		try {
			// 获取本地IP对象
			InetAddress ia = InetAddress.getLocalHost();
			// 获得网络接口对象（即网卡），并得到mac地址，mac地址存在于一个byte数组中。
			byte[] mac = NetworkInterface.getByInetAddress(ia).getHardwareAddress();
			StringBuffer sb = new StringBuffer("");
	        for (int i = 0; i < mac.length; i++) {
	            sb.append(String.format("%02X%s", mac[i], (i < mac.length - 1) ? "-" : ""));        
	        }
	        return sb.toString();
		} catch (Exception e) {
			return "";
		}
	}
	
	private static Set<String> _localAddress;
	private static Set<String> getLocalAddress() {
		if (_localAddress == null) {
			try {
				_localAddress = new HashSet<>();
				InetAddress ia = InetAddress.getLocalHost();// 获取本地IP对象
				_localAddress.add("127.0.0.1");
				_localAddress.add("0:0:0:0:0:0:0:1");
				_localAddress.add("localhost");
				_localAddress.add(ia.getHostAddress());
				_localAddress.add(ia.getHostName());
			} catch (UnknownHostException e) {}
		}
		return _localAddress;
	}
}
